/*
 * @Author: sky 1575951471@qq.com
 * @Date: 2024-06-03 21:35:33
 * @LastEditors: sky 1575951471@qq.com
 * @LastEditTime: 2024-12-03 22:07:18
 * @FilePath: \sky-esp32-Base\components\BSP\IIC\i2c.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "i2c.h"


esp_err_t i2c_num0_write_byte(uint8_t addr, uint8_t *byte, uint16_t len)
{
    esp_err_t ret = ESP_FAIL;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();                           //用于创建一个I2C命令链接，在发送或接收I2C数据时，需要先建立一个命令链，然后添加相应的命令
    i2c_master_start(cmd);                                                  //向I2C命令链中添加开始信号
    i2c_master_write_byte(cmd, (addr << 1)|I2C_FLAG_WRITE, ACK_CHECK_EN);   //向命令链中添加一个写设备地址和写命令的字节。
    i2c_master_write(cmd, byte, len, ACK_CHECK_EN);                         //向命令链中添加写设备寄存器与寄存器数据命令的字节
    i2c_master_stop(cmd);                                                   //向命令链中添加停止信号命令
    ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 100 * (1+len)/portTICK_PERIOD_MS);   //开始发送命令
    i2c_cmd_link_delete(cmd);                                                       //释放命令链接存储空间
    return ret;        
}

esp_err_t i2c_num0_read_byte(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data)
{
    esp_err_t ret = ESP_FAIL;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();                               //用于创建一个I2C命令链接，在发送或接收I2C数据时，需要先建立一个命令链，然后添加相应的命令
    i2c_master_start(cmd);                                                      //向I2C命令链中添加开始信号
    i2c_master_write_byte(cmd, (dev_addr << 1)|I2C_FLAG_WRITE, ACK_CHECK_EN);   //向命令链中添加一个写设备地址和写命令的字节。
    i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN);                         //向命令链中添加写设备寄存器地址命令字符。
    i2c_master_start(cmd);                                                      //向命令链发送起始信号
    i2c_master_write_byte(cmd, (dev_addr << 1)|I2C_FLAG_READ, ACK_CHECK_EN);    //向命令链发送设备地址和读命令的字符
    i2c_master_read_byte(cmd, data, I2C_MASTER_LAST_NACK);                      //读取从机数据
    i2c_master_stop(cmd);                                                       //发送停止信号

    ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 400/portTICK_PERIOD_MS);         //开始发送命令
    i2c_cmd_link_delete(cmd);                                                   //释放命令链接存储空间
    return ret;  
} 


void i2c_init_num0(void)
{
    i2c_config_t i2c_config_struct = {0};
    uint8_t init_flag = 0;

    i2c_config_struct.mode = I2C_MODE_MASTER;                                           //配置I2C模式为master
    i2c_config_struct.sda_io_num = IIC0_SDA_GPIO_PIN;                                   //配置I2C的SDA引脚号
    i2c_config_struct.scl_io_num = IIC0_SCL_GPIO_PIN;                                   //配置I2C的SCL引脚号
    i2c_config_struct.sda_pullup_en = GPIO_PULLUP_ENABLE;                               //配置SDA引脚上拉使能
    i2c_config_struct.scl_pullup_en = GPIO_PULLUP_ENABLE;                               //配置SCL引脚上拉使能
    i2c_config_struct.master.clk_speed = IIC_FREQ;                                      //设置I2C通信速率
    i2c_param_config(I2C_NUM_0, &i2c_config_struct);                                    //设置I2C初始化参数
    init_flag = i2c_driver_install(I2C_NUM_0,                                           //端口号
                                   i2c_config_struct.mode,                              //主机模式
                                   I2C_MASTER_RX_BUF_DISABLE,                           //从机模式下接收缓存大小(主机模式下不使用)
                                   I2C_MASTER_TX_BUF_DISABLE,                           //从机模式下发送缓存大小(主机模式下不使用)
                                   0);                                                  //用于分配中断的标志(通常从机模式使用)
    if(init_flag != ESP_OK)
    {
        while (1)
        {
            printf("%s,ret: %d",__func__, init_flag);
            vTaskDelay(1000);
        }
        
    }
}



